#ifndef LOGINDIALOG_H
#define LOGINDIALOG_H

/******************************************************************************
 *
 * @file       logindialog.h
 * @brief      登陆界面（程序一运行就看见的界面）
 *
 * @author     ax
 * @date       2024/05/09
 * @history
 *****************************************************************************/

#include "global.h"
#include "HttpMgr.h"
#include "tcpmgr.h"

#include <QDialog>
#include <QLabel>
#include <QRegularExpression>
#include <QString>
#include <QJsonDocument> // jsonDoc
#include <QMap>
#include <QUrl>
#include <QTimer>

namespace Ui {
class LoginDialog;
}

class LoginDialog : public QDialog
{
    Q_OBJECT

public:
    explicit LoginDialog(QWidget *parent = nullptr);
    ~LoginDialog();

signals:
    void switchRegister(); // 登陆页面点击注册按钮触发的信号
    void switchReset(); // LoginDialog 界面忘记密码给 MainWindow 界面发射的信号

    void sig_tcp_connect(ServerInfo chatServer);
    void SigSwitchChat(); // LoginDialog 请求 MainWindow 切换到聊天界面

private slots:
    void slot_forget_pwd(); // 点击忘记密码ClikcedLabel，触发的槽函数

    void on_login_btn_clicked(); // 点击登陆按钮触发的槽函数 this ===> HttpMgr
    void slot_login_mod_finish(ReqId id, QString res, ErrorCodes err); // HttpMgr ===> this

    void slot_tcp_con_finish(bool bsuccess); // TcpMgr 连接 ChatServer 成功
    void slot_login_failed(int); // TcpMgr 发送 login 请求建立长连接聊天请求失败
    void slot_login_success(); // TcpMgr 发送 login 请求建立长连接聊天请求成功 ---> 聊天界面
private:
    Ui::LoginDialog *ui;

    // 消息处理的声明
    void initHandlers();
    QMap<ReqId, std::function<void(const QJsonObject&)>> _handlers; // 消息处理

    // ui->tip_lb 提示Label的设置
    void showTip(QString errstr = "", bool b_ok = true);
    // 登陆界面输入框的验证
    bool checkUserValid();
    bool checkPwdValid();

    // （err_tip 提示框的设置）添加和删除错误
    void AddTipErr(TipErr err, QString tip);
    void DelTipErr(TipErr err);
    QMap<TipErr, QString> _tip_errs; // _tip_errs用来缓存各个输入框输入完成后提示的错误，如果该输入框错误清除后就显示剩余的错误，每次只显示一条

    //
    QString _token;
    int _uid;

    // 进入聊天界面延迟 _count 秒
    QTimer* _enterChatDialogTimer = nullptr;
    int _count = 5;
};

#endif // LOGINDIALOG_H
